*B 4, Q-, R+, U-, G 0, S 14
;
; bekslesj.tsr
;
; Deze TSR vormt teken nummer 92 tot een backslash teken. Op een japanse
; computer staat hier namelijk een yen-teken in plaats van een backslash,
; wat onder dos niet echt lekker werkt.
;
; Dit is de Header voor de TSR
;
	defb "MST TSR",13,10     ;File herkennings naam
	defb "RWi BekSlesj",26   ;Unieke id naam
	defw 0003	;Header file versie: MemMan 2.4 TSR
	defw tsrCode	;Code adres
	defw tsrInit	;Init adres
	defw tsrKill	;Kill adres
	defw tsrTalk	;Interactie adres
	defw tsrCodeLen	;Programma code lengte
	defw tsrInitLen	;Init code lengte

; Dit is de Code voor de TSR
;
tsrCode:

tsrFuncHand	equ 4002h	;MemMan function handler entry for TSRs

; addHeapCall
;
; Dit is karakterset kopieer hook. Deze hook wordt aangeroepen voordat de
; karakterset in het vram wordt gezet.
; Bij de aanroep van die routine in de heap staat de karakterset dan al in
; het geheugen en kunnen we de backslash aanpassen.
;
addHeapCall:	pop de	;Terugkeer adres naar TSR Manager eraf
	pop bc	;ROM Terugkeeradres eraf

	ld hl,(heapAddr)	;Adres van onze routine
	push hl	;Zet die ertussen op de stack

	push bc	;Herstel ROM terugkeer adres
	push de	;Herstel TSR Manager terugkeer adres

	sub a	;Volgende hooks ook uitvoeren
	ex af,af'                ;Status in A'
	ret


; newChar
;
; Deze routine wordt vanuit de heap aangeroepen omdat de karakterset kopieer
; hook routine het aanroepadres op de stack gezet heeft. Op het moment van
; aanroep van deze routine staat de karakterset al in het vram en kunnen we
; de backslash aanpassen.
;
; In: DI
;
tsrTalk:	cp "\"                   ;Backslash installeren?
	ret nz	;Nee, hoe kan deze aanroep?

newChar:	sub a	;Pagina 0 van het vram
	out (099h),a	;Stuur de data
	ld a,128+14	;Pagina selectie register, schrijven
	out (099h),a	;Stuur het command en register nummer

	ld hl,(0f924h)	;Pattern table address
	ld de,92*8	;Zoveel erbij optellen voor de bekslejs
	add hl,de	;Bereken het juiste vram adres
	ld a,l
	out (099h),a	;Stuur het LSB
	ld a,h
	and 3fh	;Validate de bits
	or 40h	;Schrijven
	out (099h),a	;Stuur het MSB

	ld hl,charData	;Daar staat de data
	ld bc,8*256+98h	;8 bytes door de VDP datapoort sturen
	otir	;Zet de data op het scherm
	ret

charData:	defb %00000000	;Matrix van de backslash
	defb %00000000
	defb %10000000
	defb %01000000
	defb %00100000
	defb %00010000
	defb %00001000
	defb %00000000


; Dit is de destructie routine
;
; Het heap geheugen wordt weer vrijgegeven en verder niets.
;
tsrKill:	ld e,71	;DeAlloc Heap Memory
	ld hl,(heapAddr)	;Daar begint de ruimte
	jp tsrFuncHand	;Geef de ruimte weer vrij

heapAddr:	defw 0	;Adres op de heap

tsrCodeLen	equ $-tsrCode	;Length of TSR programcode


; Dit is de Init voor de TSR
;
tsrInit:	ld (fakeHook+1),bc	;TsrID invullen

	ld hl,tTsrName	;Tsr naam
	ld e,62	;Find tsrid functie
	call tsrFuncHand	;Is de tsr al geinstalleerd?
	ld de,tAlready	;Foutmelding
	ld a,3	;Print msg, do not install
	ret nc

	ld de,70	;Heap Alloc
	ld hl,fakeHookLen	;Lengte van de code
	call tsrFuncHand	;Vraag de ruimte aan
	ld a,h	;Is er wel genoeg geheugen verkregen?
	or l
	ld de,tMoreHeap	;Foutmelding tekst, in case...
	ld a,3	;Intro tekst & niet installeren
	ret z	;Keer terug

	ld (heapAddr),hl	;Opslaan voor Kill

	ld de,50	;Info functie
	ld b,3	;TsrCall handler adres opvraag functie
	call tsrFuncHand	;Vraag het adres op
	ld (tsrCallJpAd+1),hl	;Vul het adres in

	ld hl,fakeHook	;Daar begint de fake-hook routine
	ld de,(heapAddr)	;Daar de routine neerzetten
	ld bc,fakeHookLen	;Lengte van de routine
	ldir	;Kopieer de routine

	ld de,tIntroMsg	;Intro tekstje
	ld a,2	;Flag 2: Print Message, install
	ret	;Init ready


; fakeHook
;
; Deze routine wordt naar pagina 3 verplaatst en roept weer de TSR aan
; om het karakter aan te laten passen.
;
fakeHook:	ld bc,0	;3 TsrID
	ld a,"\"                 ;2 BackSlash aanpassen (extra check)
tsrCallJpAd:	jp 0	;3 Spring naar TsrCall

fakeHookLen	equ $-fakeHook	;8 (ook in tekst invullen!)


tTsrName:	defb "RWi "
tIntroMsg:	defb "BekSlesj (BackSlash) TSR version 1.1",13,10
	defb "(c) Ramon van der Winkel 1992",13,10,10,0
tMoreHeap:	defb "Not enough heap memory: 8 bytes required",13,10,10,0
tAlready:	defb "RWi BekSlesj is already installed",13,10,10,0

tsrInitLen:	equ $-tsrInit	;Lengte van de init routine


; Dit zijn de Hooks voor de TSR
;
tsrHooks:	defw tsrHookLen	;Length of HokTab

	defw 0fdc7h	;H.INIP (initialise pattern)
	defw addHeapCall	;Heap call tussenvoegen

tsrHookLen	equ $-tsrHooks	;Lengte van de hook tabel

	end	;bekslesj.gen
